import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';

let initState = {
    meal_list: [],  // 外卖某商户菜品列表
    meal_selected_cate: "",  // 当前选中的菜品的分类
    meal_selected_cate_index: 0, // 当前选中的菜品分类的索引号
    meal_position_arr: [], // 存放tab位置的数组 从0算起 ，第二个tab的位置等于第一个的位置+第一个children的总长度
    loaded: false, // 数据是否加载
    list: {}, //所有数据
    category: [], // 产品分类
    list_cate: [], // 当前分类下的数据列表
    cart_list: [], //购物车
    totalNum: 0, //购物车上的数量
    dish_list: [], // 菜品列表
    dish_origin_list: [],// 菜品列表原始数据
    dish_cate: [],  // 菜品纵向分类

}

let totalNum = (cart_list) => {
    let total = 0;
    cart_list.forEach((item) => {
        total += item.cartnum;
    })

    return total;
}

let removeNum = (list, item) => {
    let index = list.findIndex((ite) => ite.key + '' === item.key + '');
    if (index >= 0) {
        list[index].cartnum--;
    }

    return list
}

let addNum = (list, item) => {
    let index = list.findIndex((ite) => ite.key + '' === item.key + '');
    list[index].cartnum++;
    return list
}


let reducer = (state = initState, actions) => {
    switch (actions.type) {

        // 外卖APP

        case "SET_MEAL_LIST":  // 设置外卖某商户菜品
            state.meal_list = actions.data; // 设置菜品列表
            state.meal_selected_cate = actions.data[0].cate; // 设置默认选中的分类
            state.meal_selected_cate_index = 0;  // 设置默认选中分类的索引


            // 计算tab位置
            // 存放每个index的初始位置
            let arr = [0];  //第一个tab的位置为0
            actions.data.forEach((item, i) => {
                let position = arr[i] + (48 + item.children.length * 174);  // 标题高度为50，每个菜品高度166 
                arr.push(position);
            });
            state.meal_position_arr = arr;
            console.log('.meal_position_arr',state.meal_position_arr);


            break;

        case "SELECT_MEAL_CATE": // 选中外卖菜品分类
            state.meal_selected_cate = actions.data.meal_selected_cate;
            state.meal_selected_cate_index = actions.data.meal_selected_cate_index;
            break;




        // 卖菜APP

        case "SET_DISH_LIST":  // 设置菜品列表
            state.dish_origin_list = actions.data.list;
            state.dish_list = actions.data.list;
            state.dish_cate = actions.data.cate; // 设置菜品的纵向分类
            break;

        case "SELECT_CATE":   // 选中菜品纵向分类
            // 恢复数据 从原始数据拷贝
            state.dish_list = JSON.parse(JSON.stringify(state.dish_origin_list));

            if (actions.data) {
                // 做筛选
                state.dish_list.forEach((tab) => {
                    tab.children = tab.children.filter((item) => item.cate === actions.data);

                })

                break;
            }
            break;
        case "SET_LIST":
            state.list = actions.data; // 设置list
            state.loaded = true; // 更新加载状态
            state.category = Object.keys(actions.data); // 初始化分类
            state.list_cate = actions.data[Object.keys(actions.data)[0]]; // 获取到第一个分类下的列表
            break;

        case "SELECT_CATEGORY": // 选中分类
            state.list_cate = state.list[actions.data];
            break;

        case "ADD_CART":  // 从产品列表添加到购物车
            state.list_cate = addNum(state.list_cate, actions.data); // 更新当前分类下的数据列表list_cate中 该产品的cartnum值 +1
            state.list[actions.data.cate] = addNum(state.list[actions.data.cate], actions.data);  //更新产品列表list上的 该产品cartnum值 +1

            // 查询购物车列表是否已经包含了该产品
            let index_add = state.cart_list.findIndex((item) => actions.data.key + '' === item.key + '');


            if (index_add === -1) {
                // 没有包含该产品 ，将该产品添加到购物车
                state.cart_list.push(actions.data)
            } else {
                // 已经包含该产品， 把产品的cartnum加1
                state.cart_list[index_add].cartnum++;
            }
            state.totalNum = totalNum(state.cart_list);// 重新计算购物车上的数量
            break;

        case "REMOVE_CART":  // 从产品列表 减少购物车
            state.list_cate = removeNum(state.list_cate, actions.data); //  更新当前分类下的数据列表list_cate中 该产品的cartnum值 -1
            state.list[actions.data.cate] = removeNum(state.list[actions.data.cate], actions.data);  //更新产品列表list上的 该产品cartnum值 -1

            //查询此产品在购物车列表中的位置
            let index_remove = state.cart_list.findIndex((item) => actions.data.key + '' === item.key + '');

            // 如果找到购物车上的位置  就对购物车做操作
            if (index_remove >= 0) {

                // 如果产品原先的购物车数量是1 ，就从购物车中移除该产品
                if (actions.data.cartnum === 1) {
                    state.cart_list.splice(index_remove, 1)
                } else {
                    // 该产品原先的数量>1 就把该购物车上的数量减一
                    state.cart_list[index_remove].cartnum--;
                }
            } else {
                // 没找到购物车上的位置 ，说明此产品没有在购物车里
                // 不用对购物车做任何操作
            }


            state.totalNum = totalNum(state.cart_list);// 重新计算购物车上的数量
            break;


        default:
    }

    return JSON.parse(JSON.stringify(state));
}

export default createStore(reducer, applyMiddleware(thunk));